package br.com.afi.pattern.business;

import java.io.Serializable;
import java.util.List;

import br.com.afi.pattern.converter.Converter;
import br.com.afi.pattern.model.Model;
import br.com.afi.pattern.vo.ValueObject;

/**
 * Essa interface possui as assinaturas dos métodos necessários para implementar as quatro operações
 * básicas utilizando {@link ValueObject}. Existem duas versões de métodos para cada tipo de
 * operação, uma versão trabalha apenas com {@link Model} (Entity) e a outra trabalha apenas com
 * {@link ValueObject}. Implemente esta interface nas classes que contém a regra de negócio.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 * @param <E> Tipo do Model
 * @param <V> Tipo do Value Object
 * @param <ID> Tipo do Id do Model (Entity)
 */
public interface BusinessValueObjectConverter<E extends Model<ID>, ID extends Serializable, V extends ValueObject> extends Business<E, ID>, Converter<E, V>
{
	/**
	 * Busca através do Id.
	 * 
	 * @param id Id
	 * @return Value Object
	 */
	public V findVOById( ID id );

	/**
	 * Verifica se existe um registro com o Id informado.
	 * 
	 * @param id Id
	 * @return Verdadeiro se existir
	 */
	public boolean existsById( ID id );

	/**
	 * Solicita a gravação dos dados do {@link ValueObject} informado.
	 * 
	 * @param v Value Object
	 * @return Value Object
	 * @throws BusinessException Lançada quando ocorrer alguma exceção na regra de negócio
	 */
	public V saveVO( V v ) throws BusinessException;

	/**
	 * Solicita a remoção dos dados do Value Object informado.
	 * 
	 * @param v Value Object
	 * @throws BusinessException Lançada quando ocorrer alguma exceção na regra de negócio
	 */
	public void deleteVO( V v ) throws BusinessException;

	/**
	 * Busca todos os Value Objects.
	 * 
	 * @return Lista de Value Objects
	 */
	public List<V> findVOAll();
}
